复制集
概述
在分布式系统中,数据的高可用性和容错性是至关重要的。MongoDB 通过复制集(Replica Set)来实现这一目标。复制集是一组 MongoDB 实例,它们共同维护相同的数据集。其中一个实例作为主节点(Primary),负责处理所有的写操作;其他实例作为从节点(Secondary),负责复制主节点的数据,并在主节点失效时接管服务。
复制集的工作原理
主节点和从节点
- 主节点(Primary):主节点是唯一能够处理写操作的节点。所有的写操作都会被记录到主节点的操作日志(Oplog)中。
- 从节点(Secondary):从节点通过复制主节点的 Oplog 来同步数据。从节点可以处理读操作,但不能处理写操作。
选举机制
当主节点失效时,复制集会通过选举机制选出一个新的主节点。选举过程由复制集中的大多数节点参与,确保系统的稳定性和一致性。
配置复制集
步骤 1:启动 MongoDB 实例
首先,我们需要启动多个 MongoDB 实例,每个实例代表复制集中的一个节点。
# 启动第一个实例
mongod --replSet myReplSet --port 27017 --dbpath /data/db1
# 启动第二个实例
mongod --replSet myReplSet --port 27018 --dbpath /data/db2
# 启动第三个实例
mongod --replSet myReplSet --port 27019 --dbpath /data/db3
步骤 2:初始化复制集
连接到其中一个实例,并初始化复制集。
mongo --port 27017
在 MongoDB Shell 中执行以下命令:
rs.initiate(
{
_id: "myReplSet",
members: [
{ _id: 0, host: "localhost:27017" },
{ _id: 1, host: "localhost:27018" },
{ _id: 2, host: "localhost:27019" }
]
}
)
步骤 3:验证复制集状态
使用 rs.status() 命令查看复制集的状态。
rs.status()
实践练习
练习 1:创建和查询文档
在主节点上创建一个文档,并在从节点上查询该文档。
// 在主节点上创建文档
db.myCollection.insertOne({ name: "Alice", age: 30 })
// 在从节点上查询文档
mongo --port 27018
rs.slaveOk()
db.myCollection.find()
练习 2:模拟主节点失效
停止主节点,观察从节点如何接管服务。
# 停止主节点
kill -9 <primary_pid>
在 MongoDB Shell 中查看复制集状态,确认新的主节点已经选举出来。
rs.status()
总结
通过本教程,我们了解了 MongoDB 复制集的基本概念、工作原理以及如何配置和使用复制集。复制集是确保数据高可用性和容错性的关键组件,掌握其使用方法对于构建稳定可靠的分布式系统至关重要。
下一步
- 学习如何配置复制集的优先级和延迟节点。
- 探索复制集的故障恢复和自动故障转移机制。
- 深入研究 MongoDB 的分片集群(Sharded Cluster),以处理更大规模的数据。